#include "i2c_ground.h"


esp_err_t esp32_i2c_init(char SCL , char SDA , int I2C_SCL_Frequency)
{
	// 初始化I2C配置
	i2c_config_t i2c_config = {
		.mode = I2C_MODE_MASTER, // 设置i2c模式
		.sda_io_num = SDA, // 设置SDA引脚
		.scl_io_num = SCL, // 设置SCL引脚
		.sda_pullup_en = GPIO_PULLUP_ENABLE, // 设置上拉使能
		.scl_pullup_en = GPIO_PULLUP_ENABLE, // 设置上拉使能
		.master.clk_speed = I2C_SCL_Frequency, // 设置时钟频率xxxbit
		// .clk_flags = 0,
	};
	// 设置I2C
	i2c_param_config(
		I2C_NUM,
		//配置参数初始化，此函数内部就是将i2c_config 中的相关参数 填入到 "I2c_NUM "对应的结构体中。
		&i2c_config);
	// 注册I2C服务及使能  (安装 I2C 驱动程序后， ESP32 即可与其他 I2C 设备通信。)
	esp_err_t err = i2c_driver_install(
		I2C_NUM, i2c_config.mode, 0, 0,
		0); //初始化配置以外的所有相关参数，将配置写入寄存器
	return err; //可以直接访问esp32_i2c_init的返回值 即可知道,驱动是否安全完成.
}


char i2c_write_addr(char SlaveAddr, char endbit)
{
	//创建i2c_cmd_handle_t对象
	i2c_cmd_handle_t cmd = i2c_cmd_link_create();
	//添加各种子数据帧
	i2c_master_start(cmd); //向cmd对象添加起始信号
	i2c_master_write_byte(
		cmd, (SlaveAddr << 1) | endbit,
		true); //向cmd对象添加从机r地址及读写位 ack(true)为检测slave答应
	//i2c_master_write(cmd, bytes, datalen, true);	//向cmd对象添加数据位(数组)
	i2c_master_stop(cmd); //向cmd对象添加终止信号
	//向I2C_NUM 发送这个数据帧cmd，
	i2c_master_cmd_begin(I2C_NUM, cmd, 1000 / portTICK_RATE_MS);
	//删除i2c_cmd_handle_t对象，释放资源
	i2c_cmd_link_delete(cmd);
	return 0;
}


uint16_t i2c_read_slave(char SlaveAddr, char endbit)
{
	static uint8_t readvalue1; //切记搞成static的,不然会灵异读取
	static uint8_t readvalue2; //切记搞成static的,不然会灵异读取
	uint16_t readvalue = 0;
	esp_err_t err = ESP_OK;

	//创建i2c_cmd_handle_t对象
	i2c_cmd_handle_t cmd = i2c_cmd_link_create();

	i2c_master_start(cmd); //向cmd对象添加起始信号
	i2c_master_write_byte(
		cmd, (SlaveAddr << 1) | endbit,
		true); //向cmd对象添加从机地址及读写位 ack(true)为检测slave答应
	//******开始读数据操作:总共读16bit*****//
	err = i2c_master_read_byte(cmd, &readvalue1, ACK_VAL);
	err = i2c_master_read_byte(cmd, &readvalue2, NACK_VAL);
	if (err != ESP_OK) {
		goto end;
	}

	i2c_master_stop(cmd); //向cmd对象添加终止信号
	//向I2C_NUM 发送这个数据帧cmd，
	i2c_master_cmd_begin(I2C_NUM, cmd, 1000 / portTICK_RATE_MS);
	//删除i2c_cmd_handle_t对象，释放资源
end:
	i2c_cmd_link_delete(cmd);
	readvalue = readvalue1 << 8 | readvalue2;
	//printf("err is %d \n",err);//调试&查bug用
	//printf("SlaveAddr is %X \n",(SlaveAddr<<1)|endbit);//调试&查bug用
	//printf("i2c_read_slave is %X \n",readvalue);//调试&查bug用
	return readvalue;
}
